iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Software Development

30天快速打造Python資料結構&演算法邏輯刷爆LeetCode系列 第 10

DAY 10 「選擇排序(Selection Sort)」容易實作直觀的Python程式碼撰寫~

  • 分享至 

  • xImage
  •  

選擇顧名思義就是從每個元素找最大/小放好到最後~

/images/emoticon/emoticon09.gif白話來說選擇排序容易實現,但時間複雜度較高不適合用於大規模數據的排序~

  • 最佳情況/最壞情況完全倒序/平均情況時間複雜度都是O(n^2)
  • 不穩定排序(相同元素的相對位置每次排序不一定相同)

使用了兩個嵌套的迴圈
Step1:第一個迴圈從第一個開始遍歷後面未排序的元素
Step2:第二個迴圈與其他未排序元素中尋找最小的元素並進行交換位置
這樣就保證每一次的迴圈的元素的該位置都是最小值就相當於程式跑完全部數列就會由小到大排序啦~~~
第一次選擇(i=0):
從索引 0 開始,找到未排序部分的最小值,也就是 11
交換索引 0 與最小值所在位置,這樣列表變為 [11, 34, 25, 12, 22, 64, 90]
第二次選擇(i=1):
從索引 1 開始,找到未排序部分的最小值,也就是 12
交換索引 1 與最小值所在位置,這樣列表變為 [11, 12, 25, 34, 22, 64, 90]
第三次選擇(i=2):
從索引 2 開始,找到未排序部分的最小值,也就是 22
交換索引 2 與最小值所在位置,這樣列表變為 [11, 12, 22, 34, 25, 64, 90]
...
第七次選擇(i=6):
從索引 6 開始,找到未排序部分的最小值,也就是 90
交換索引 6 與最小值所在位置,這樣列表保持不變

def selection_sort(arr):
    n = len(arr)
    # Step1:第一個迴圈從第一個開始遍歷後面未排序的元素
    for i in range(n-1):
        min_idx = i
        # Step2:第二個迴圈與其他未排序元素中尋找最小的元素並進行交換位置
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

# 使用範例
my_list = [64, 34, 25, 12, 22, 11, 90]
selection_sort(my_list)
print("排序後的列表:", my_list)

上一篇
DAY 9 「插入排序 (Insertion Sort)」類似於撲克牌整理的Python程式碼撰寫~
下一篇
DAY 11 「二元搜尋(Binary Search)」進入搜索領域的Python程式碼撰寫~
系列文
30天快速打造Python資料結構&演算法邏輯刷爆LeetCode30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言